package ysf.com.mediumdifficulty;

/**
 * @author ysf
 * @date 2021/6/5 23:19
 */
public class SecondCreateListNode {

    public static void main(String[] args) {

        SecondListNode nodeSta = new SecondListNode(0);   // 创建首结点
        SecondListNode nextNode;                       // 声明一个变量用来移动过程中指向当前结点
        nextNode = nodeSta;                     // 指向首结点

        // 创建链表
        for (int i = 1; i <= 4; i++) {
            SecondListNode node = new SecondListNode(i);   // 创建新的结点
            nextNode.next = node;        //  把新结点连接起来
            nextNode = nextNode.next;    // 当前结点往后移
        }  // 当 for 循环完成之后 nextNode指向最后一个结点
        nextNode = nodeSta;  // 重新赋值让它指向首结点
        print(nextNode);

        System.out.println("===============================插入结点================================");
        // 插入结点
        while (nextNode != null) {
            // if 代码块 为ListNode链表
            if (nextNode.val == 2) {
                SecondListNode newNode = new SecondListNode(99);  // 生成新的结点
                SecondListNode node = nextNode.next;           // 先保存下一个结点
                nextNode.next = newNode;                // 插入新的结点
                newNode.next = node;                   // 新结点的下一个结点指向 之前保存的结点
            }
            nextNode = nextNode.next;                 // 当前结点往后移
        }
        nextNode = nodeSta;                          // 重新赋值让它指向首结点
        print(nextNode);

        System.out.println("=============================替换结点================================");
        while (nextNode != null) {
            if (nextNode.val == 99) {
                SecondListNode newnode = new SecondListNode(100);   // 生成新的结点
                SecondListNode node = nextNode.next.next;        // 先要保存替换节点的下一个结点
                //System.out.println("保存替换的结点是：" + JSON.toJSONString(node.next));
                nextNode.next.next = null;                 // 被替换结点 指向为空 等待Java垃圾回收
                nextNode.next = newnode;                  // 插入新的结点
                newnode.next = node;                     // 新结点的下一个结点指向之前保存的结点
            }
            nextNode = nextNode.next;
        }
        nextNode = nodeSta;
        print(nextNode);
        System.out.println("==========================删除结点===============================");
        // 删除结点
        while (nextNode != null) {
            if (nextNode.val == 99) {
                SecondListNode secondListNode = nextNode.next.next;     // 保存要删除结点的下一个结点
                System.out.println("要删除结点的下一个结点的值是：" + secondListNode.val + "要删除结点的下一个结点的next是：" + secondListNode.next);
                nextNode.next.next = null;
                System.out.println("要删除的结点的值是：" + nextNode.next.val);

                nextNode.next = secondListNode;               // 指向要删除结点的下一个结点
            }
            nextNode = nextNode.next;    // 循环结束之后 nextNode 指向最后一个结点
        }
        nextNode = nodeSta;          // 重新赋值指向首结点
        print(nextNode);

    }

    public static void print(SecondListNode listNoed) {
        // 循环输出 ListNode 结点的值
        while (listNoed != null) {
            System.out.println("结点：" + listNoed.val);
            listNoed = listNoed.next;
        }
        System.out.println();
    }

}
